package app.core.utils;

import lombok.SneakyThrows;
import org.apache.commons.io.FileUtils;
import org.springframework.util.StringUtils;

import java.awt.*;
import java.io.File;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Objects;

/**
 * 拯救人生
 * @author feizns
 * @since 2025/4/6
 */
public class Mavens {

    /**
     * 项目复制到
     * @param name 名字
     */
    public static void projectCopyTo(String name) {
        projectCopyTo(basePath().getParentFile(), name);
    }

    /**
     * 新项目创建
     * @param name 名字
     */
    @SneakyThrows
    public static void projectCopyTo(File targetDir, String name) {
        if ( !StringUtils.hasText(name) )
            throw new RuntimeException("项目名不能为空");
        //项目根目录
        File file = basePath();
        //
        File newFile = new File(targetDir, name);
        if ( newFile.exists() )
            throw new RuntimeException("项目已存在");
        FileUtils.copyDirectory(file, newFile, f -> (!f.getName().contains("/target")
                && !f.getName().equals(".idea")
                && !f.getName().equals(".git")));
        renamePom(newFile.getPath() + "/pom.xml", name);
        //修改各模块文件
        for (File moduleFile : Objects.requireNonNull(newFile.listFiles(f -> f.getName().startsWith("save-life")))) {
            File newModuleFile = new File(newFile, moduleFile.getName().replace("save-life", name));
            if ( !moduleFile.renameTo(newModuleFile) )
                throw new RuntimeException("重命名失败");
            renamePom(newModuleFile.getPath() + "/pom.xml", name);
        }
        //打开目录
        Desktop.getDesktop().open(newFile);
    }

    /**
     * 重命名pom.xml项目名称
     * @param pomXmlPath pomXmlPath路径位置
     */
    @SneakyThrows
    public static void renamePom(String pomXmlPath, String newProjectName) {
        File file = new File(pomXmlPath);
        String pomXml = pom(file.toString()).replaceAll("save-life", newProjectName);
        FileUtils.write(file, pomXml, Charset.defaultCharset());
    }

    /**
     * pom.xml文件内容
     * @param pomXmlPath pom.xml文件地址
     * @return {@link String}
     */
    @SneakyThrows
    public static String pom(String pomXmlPath) {
        return FileUtils.readFileToString(new File(pomXmlPath), Charset.defaultCharset());
    }

    /**
     * 基本路径
     * @return {@link File }
     */
    public static File basePath() {
        return basePath(Mavens.class);
    }

    /**
     * 项目文件根路径
     * @return {@link File}
     */
    public static File basePath(Class<?> applicationClass) {
        URL url = applicationClass.getResource("/");
        return new File(Objects.requireNonNull(url).getFile())
                .getParentFile()
                .getParentFile()
                .getParentFile();
    }

}
